package com.zzsz.Controller;

import cn.hutool.core.lang.tree.Tree;
import com.zzsz.common.core.controller.BaseController;
import com.zzsz.common.core.domain.AjaxResult;
import com.zzsz.common.core.page.TableDataInfo;
import com.zzsz.common.utils.poi.ExcelUtil;
import com.zzsz.domain.ProductsCategoriesInventoryVO;
import com.zzsz.domain.ZzszAddProductsDTO;
import com.zzsz.service.impl.InventoryServiceImpl;
import com.zzsz.domain.ZzszProductCategories;
import com.zzsz.utils.AliyunOSSUtil;
import com.zzsz.utils.ExcelExportUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.function.Function;

/**
 * @Classname InventoryController
 * @Description
 * @Date 2025/9/2 8:16
 * @Created by SYL
 */
@Slf4j
@RequestMapping("/Inventory")
@RestController
public class InventoryController extends BaseController {
    @Autowired
    private InventoryServiceImpl inventoryService;


    /**
     * 商品及其处在分类的库存列表
     * @return
     */
    @GetMapping("/list")
    public TableDataInfo list(ProductsCategoriesInventoryVO productsCategoriesInventoryVO){
        startPage();
        log.info("执行list 搜索参数:{}",productsCategoriesInventoryVO);
        List<ProductsCategoriesInventoryVO> list = inventoryService.list(productsCategoriesInventoryVO);
        log.info("list:{}",list);
        return getDataTable(list);
    }

    @GetMapping("/getCategoryName")
    public AjaxResult getCategoryName(){

        log.info("执行getCategoryName");
        List<Tree<String>> list = inventoryService.getCategoryName();
        log.info("list:{}",list);

        return AjaxResult.success(list);
    }


    /**
     * 用于添加商品的一级分类菜单
     * @return
     */
    @GetMapping("/add/getCategoryName1V")
    public AjaxResult getCategoryName1V(){

        log.info("执行/add/getCategoryName1");
        List<ZzszProductCategories> list = inventoryService.getCategoryName1V();

        return AjaxResult.success(list);
    }
    /**
     * 用于添加商品的二级分类菜单
     * @return
     */
    @GetMapping("/add/getCategoryName2V")
    public AjaxResult getCategoryName2V(){

        log.info("执行/add/getCategoryName2");
        List<ZzszProductCategories> list = inventoryService.getCategoryName2V();

        return AjaxResult.success(list);
    }

    /**
     * 添加商品
     * @return
     */


//    public AjaxResult addProduct(@RequestParam("productName") String productName,
//                                 @RequestParam("sku") String sku,
//                                 @RequestParam("categoryId1") Long categoryId1,
//                                 @RequestParam("categoryId2") Long categoryId2,
//                                 @RequestParam("quantity") Integer quantity,
//                                 @RequestParam("costPrice") BigDecimal costPrice,
//                                 @RequestParam("price") BigDecimal price,
//                                 @RequestParam("description") String description,
//                                 @RequestParam("status") int status,
//                                 @RequestParam(value = "productImage", required = false) MultipartFile productImage) {
//
//        ZzszAddProductsDTO zzszAddProductsDTO = new ZzszAddProductsDTO();
//        zzszAddProductsDTO.setProductName(productName);
//        zzszAddProductsDTO.setSku(sku);
//        zzszAddProductsDTO.setCategoryId1(categoryId1);
//        zzszAddProductsDTO.setCategoryId2(categoryId2);
//        zzszAddProductsDTO.setQuantity(quantity);
//        zzszAddProductsDTO.setCostPrice(costPrice);
//        zzszAddProductsDTO.setPrice(price);
//        zzszAddProductsDTO.setDescription(description);
//        zzszAddProductsDTO.setStatus(status);

    /**
     * 添加商品
     * @return
     */
    @PostMapping("/add/addProduct")
    public AjaxResult addProduct( ZzszAddProductsDTO zzszAddProductsDTO){
        log.info("执行/add/addProduct,参数:{}", zzszAddProductsDTO);

        Long productId = inventoryService.addProduct(zzszAddProductsDTO);
        // 商品必须添加成功
        if (productId <= 0) {
            return AjaxResult.error("商品添加失败");
        }

        // 如果有上传图片，则处理图片上传
        String imageUrl = null;
        if (zzszAddProductsDTO.getProductImage() != null && !zzszAddProductsDTO.getProductImage().isEmpty()) {
            try {
                // 增加文件类型检查
                String contentType = zzszAddProductsDTO.getProductImage().getContentType();
                if (contentType == null || (!contentType.startsWith("image/"))) {
                    log.error("文件上传失败: 不支持的文件类型: {}", contentType);
                    return AjaxResult.error("文件上传失败: 只支持图片文件上传");
                }
                imageUrl = AliyunOSSUtil.upload(zzszAddProductsDTO.getProductImage());
                log.info("图片上传成功，URL: {}", imageUrl);
                // 增加图片URL到数据库
                 int i = inventoryService.addProductImg(productId, imageUrl);

                if (i <= 0) {
                    log.warn("商品图片URL保存失败，商品ID: {}", productId);
                }
            } catch (Exception e) {
//                throw new RuntimeException(e);
                log.error("文件上传失败", e.getMessage());
            }

        }

        return  AjaxResult.success("商品添加成功");
    }
    /**
     * 添加一级分类(大分类)
     * @return
     */
    @PostMapping("/add/addCategory1")
    public AjaxResult addCategory1(@RequestBody ZzszProductCategories ZzszProductCategories){
        log.info("执行/add/addCategory1,参数:{}",ZzszProductCategories);
        int i=  inventoryService.addCategory1(ZzszProductCategories);
        return i>0? AjaxResult.success():AjaxResult.error();
    }
    /**
     * 添加二级分类(小分类)
     * @return
     */
    @PostMapping("/add/addCategory2")
    public AjaxResult addCategory2(@RequestBody ZzszProductCategories ZzszProductCategories){
        log.info("执行/add/addCategory2,参数:{}",ZzszProductCategories);
        int i=  inventoryService.addCategory2(ZzszProductCategories);
        return i>0? AjaxResult.success():AjaxResult.error();
    }

    /**
     * 添加商品图片
     * @return
     */
    @PostMapping("/add/addProductImg")
    public AjaxResult addProductImg(@RequestParam("Producefile") MultipartFile file){  //前端传来一个文件  用@RequestParam注解指定参数名
        // 增加参数非空检查
        if (file == null) {
            log.error("文件上传失败: 文件参数为空");
            return AjaxResult.error("文件上传失败: 未接收到文件");
        }
        // 检查文件是否为空
        if (file.isEmpty()) {
            log.error("文件上传失败: 文件内容为空");
            return AjaxResult.error("文件上传失败: 文件内容为空");
        }
        //增加文件类型检查
        String contentType = file.getContentType();
        if (contentType == null || (!contentType.startsWith("image/"))) {
            log.error("文件上传失败: 不支持的文件类型: {}", contentType);
            return AjaxResult.error("文件上传失败: 只支持图片文件上传");
        }
        String ProductImg = null;
        try {
            if (!file.isEmpty()){
                ProductImg = AliyunOSSUtil.upload(file);
            }

        } catch (Exception e) {
            log.error("文件上传失败", e);
            return AjaxResult.error("文件上传失败: " + e.getMessage());
        }


        return AjaxResult.success();//暂时
    }

    @PostMapping("/addInStock")
    public AjaxResult addInStock(@RequestBody ZzszAddProductsDTO zzszAddProductsDTO){
        log.info("执行/addInStock,参数:{}",zzszAddProductsDTO);
        Long i=  inventoryService.addInStock(zzszAddProductsDTO);
        return i>0? AjaxResult.success():AjaxResult.error();
    }



    /**
     * 导出库存列表
     */
    @GetMapping("/export")
    public void exportInventory(ProductsCategoriesInventoryVO params, HttpServletResponse response) {
        log.info("执行export  开始导出库存数据，筛选参数：{}", params);


        try {
            // 1. 查询数据（复用现有业务逻辑）
            List<ProductsCategoriesInventoryVO> dataList = inventoryService.list(params);
            log.info("查询到的库存数据条数：{}", dataList);
//            // 2. 定义表头和字段映射关系
//            String[] headers = {"库存ID", "商品名称", "SKU", "分类名称", "总库存", "可用库存", "锁定库存", "状态", "更新时间"};
//            String[] fields = {"inventoryId", "productName", "sku", "categoryName", "quantity", "availableQuantity", "lockedQuantity", "status", "updatedAt"};
//
//            // 3. 调用工具类导出Excel
//            ExcelExportUtil.exportExcel(response, dataList, headers, fields, "库存数据");

            // 使用系统自带的Excel工具类导出
            ExcelUtil<ProductsCategoriesInventoryVO> util = new ExcelUtil<ProductsCategoriesInventoryVO>(ProductsCategoriesInventoryVO.class);
            util.exportExcel(response, dataList, "库存数据");
        } catch (Exception e) {
            log.error("导出失败", e);
//            ExcelExportUtil.writeErrorResponse(response, "导出失败：" + e.getMessage());
        }
    }


}

